package com.xuecheng.content.service.impl;

import com.xuecheng.content.mapper.CourseCategoryMapper;
import com.xuecheng.content.model.dto.CourseCategoryTreeDto;
import com.xuecheng.content.service.CourseCategoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

/**
 * @author ybl
 * @date 2023/2/24 19:08
 * @description 课程分类 服务类 实现类
 * @since version-1.0
 */
@Service
public class CourseCategoryServiceImpl implements CourseCategoryService {
    @Autowired(required = false)
    private CourseCategoryMapper courseCategoryMapper;

    /**
     * @author ybl
     * @date 2023/2/27 10:36
     * @description 课程分类查询服务
     * @param id 根节点id
     * @return java.util.List<com.xuecheng.content.model.dto.CourseCategoryTreeDto>
     * @since version-1.0
     */
    @Override
    public List<CourseCategoryTreeDto> queryTreeNodes(String id) {
        // 根据根节点查询所有子节点
        List<CourseCategoryTreeDto> courseCategoryTreeDtos = courseCategoryMapper.selectTreeNodes(id);
        // 调用getTreeNodes方法
        return getTreeNodes(courseCategoryTreeDtos, id);
    }

    /**
     * @author ybl
     * @date 2023/2/27 10:32
     * @description 递归，按照接口要求对数据进行封装
     * @param courseCategoryTreeDtos 所有的节点
     * @param id 根节点id
     * @return java.util.List<com.xuecheng.content.model.dto.CourseCategoryTreeDto>
     * @since version-1.0
     */
    private List<CourseCategoryTreeDto> getTreeNodes(
            List<CourseCategoryTreeDto> courseCategoryTreeDtos, String id) {
        // 通过流处理数据
        List<CourseCategoryTreeDto> collect = courseCategoryTreeDtos.stream()
                // 获取ParentId与id相同的节点
                .filter(item -> item.getParentid().equals(id))
                // 递归，处理填充数据
                .peek(item -> item.setChildrenTreeNodes(
                                getTreeNodes(courseCategoryTreeDtos, item.getId())
                        )
                )
                .collect(Collectors.toList());
        // 处理格式问题，并返回
        return collect.stream()
                .peek(item -> {
                    if (item.getChildrenTreeNodes().isEmpty()) {
                        item.setChildrenTreeNodes(null);
                    }
                }).collect(Collectors.toList());
    }
}
